package 题目集.递推;

import java.util.Scanner;

public class 机器人的摆放方式 {
    static int Sa, Sb;
    static int total;
    static int h;
    static boolean[][] path;  //记录路径,true-A，false-B

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Sa = sc.nextInt();
        Sb = sc.nextInt();
        total = Sa + Sb;
        int sum = 0;
        while (sum < total) {
            h++;
            sum += h;
        }
        path = new boolean[h + 1][h + 1];
        int dfs = dfs(0, 0, 0);
        System.out.println(dfs);
    }

    /**
     * 整个金字塔由最下层固定，故而枚举出最下层的摆放方式。找出这些方式中的合法解
     * @param i：第i位置后自由选择。
     */
    public static int dfs(int i, int ca, int cb) {
        if (i == h) {
            return check(ca, cb) ? 1 : 0;
        }
        int res = 0;
        path[0][i] = true;
        res += dfs(i + 1, ca + 1, cb);

        path[0][i] = false;
        res += dfs(i + 1, ca, cb + 1);

        return res;
    }

    /**
     * 检查当前摆放方式是否合法
     * ca,cb当前a和b的使用情况
     */
    public static boolean check(int ca, int cb) {
        for (int i = 1; i < h; i++) {   //每一层
            for (int j = 0; j < h - i; j++) {
                if (path[i - 1][j] == path[i - 1][j+1]) {    //aa型
                    if (ca >= Sa) {
                        return false;
                    }
                    ca++;
                } else if (path[i - 1][j] != path[i - 1][j+1]) {  //ab型
                    if (cb >= Sb) {
                        return false;
                    }
                    cb++;
                }
            }
        }
        return true;
    }
}
